package com.haiyou.common.http.request;

import java.io.Serializable;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.haiyou.common.constants.ErrCode;
import com.haiyou.common.http.annotation.StringValid;
import com.haiyou.common.util.check.Assert;
import com.haiyou.common.util.encryption.RSASign;
import com.haiyou.common.util.encryption.RSASignVerify;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * 
 * 
 * @Description: RSA 签名实现
 * @author xingyuan
 * @date 2022年11月3日 上午11:26:31
 */
@Getter
@Setter
@ToString
public abstract class RSASignRequest implements Serializable{
	
	/**
	 * 签名
	 */
	@StringValid(notNull = true)
	private String sign;
	
	/**
	 * 签名
	 * @param decrypt
	 * @return
	 */
	public String sign(RSASign rsaSign) {
		Assert.isTrue(rsaSign != null, ErrCode.ERROR_PARAMETER,"rsaSign not null");
		String sign = rsaSign.sign(getSignContent());
		//签名
		this.sign = sign;
		return sign;
	}
	
	/**
	 * 加密
	 * @param t
	 * @return
	 */
	public boolean verify(RSASignVerify verify) {
		Assert.isTrue(verify != null, ErrCode.ERROR_PARAMETER,"verify not null");
		return verify.verify(getSignContent(), sign);
	}
	
	/**
	 * 获取签名内容
	 * @return
	 */
	protected String getSignContent() {
		
    	JSONObject json = (JSONObject)JSON.toJSON(this);
    	//移除签名部分
    	json.remove("sign");
		
		return json.toJSONString();
	}
	
	
}
